//简化路径
/*给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为 更加简洁的规范路径。

在 Unix 风格的文件系统中规则如下：

一个点 '.' 表示当前目录本身。
此外，两个点 '..' 表示将目录切换到上一级（指向父目录）。
任意多个连续的斜杠（即，'//' 或 '///'）都被视为单个斜杠 '/'。
任何其他格式的点（例如，'...' 或 '....'）均被视为有效的文件/目录名称。
返回的 简化路径 必须遵循下述格式：

始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名（如果存在）不能 以 '/' 结尾。
此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
返回简化后得到的 规范路径 。*/
class Solution {
public:
    string simplifyPath(string path) {
        vector<string> S;
        /*if (path[path.size()] == '/' && path.size() != 1) {
                    path.pop_back();
                }*/
        // S.push("/");
        int left = 0, right = 1;
        while (right <= path.size()) {
            if (right == path.size() || path[right] == '/') {
                if (right > 1 && path[right - 1] == '.' &&
                    path[right - 2] == '/') {

                } else if (right > 2 && path[right - 1] == '.' &&
                           path[right - 2] == '.' && path[right - 3] == '/') {
                    if (S.size())
                        S.pop_back();
                } else if (right == path.size() || path[right - 1] != '/') {
                    string temp(path.begin() + left, path.begin() + right);
                    // ret += temp;
                    S.push_back(temp);
                }
                while (right < path.size() && path[right + 1] == '/') {
                    right++;
                }
                left = right;
            }
            right++;
        }
        if (S.empty())
            return "/";
        else
        // return string(S.begin(), S.end());
        {
            string _s;
            for (auto& s : S) {
                _s += s;
            }
            if (_s.size() > 1 && _s[_s.size() - 1] == '/')
                _s.pop_back();
            return _s;
        }
    }
};